package com.itheima.controller;

import com.itheima.exception.BusinessException;
import com.itheima.exception.SystemException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 *
 * 程序开发时会有很多异常
 * 每一层都可能出现异常，我们的处理方案是每一层出现了异常就都往上抛，都交给表现层处理
 * 用Aop思想来处理
 *      全局异常处理器：
 *          只要发生了异常就会交给这个类来处理
 *
 * 现在下面要研究当项目中发生异常时我们怎么去处理异常？
 *      项目异常的分类：
 *          1.业务异常(BusinessException)
 *              -- 规范的用户行为产生的异常
 *              -- 不规范的操作产生的异常      --> 必须用户在请求参数中乱输数据
 *          2.系统异常(SystemException)
 *              -- 项目运行中可预计但不可避免的异常     --> 服务器死机
 *          3.其他异常：
 *              -- 编写的代码自身的问题
 *
 *      项目异常的处理方案：
 *          1.业务异常：
 *              发送消息给用户，提醒规范操作
 *          2.系统异常：
 *              发送固定消息给用户，安抚用户
 *              发送塔顶消息给运维人员，提醒维护
 *              记录日志
 *          3.其他异常(Exception)：
 *              发送固定消息给用户，安抚用户
 *              发送特定消息给程序员，提醒检查代码
 *              记录日志
 *
 * 实现：
 *      一般是分别给这三种分类的异常，写一个类来封装这三种异常，然后凡是产生了异常，就在异常产生的地方将异常封装并且往上抛，最后全局异常处理器会处理
 *
 */

@RestControllerAdvice
public class ProjectExceptionAdvice {

    /**
     * 这个方法处理系统异常
     */
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex) {   //ex中封装了异常信息，就是业务层封装的异常对象
        //1.记录日志
        //2.发送消息给运维
        //3.发送邮件给开发人员

        return new Result(ex.getCode(),null,ex.getMessage());
    }

    /**
     * 这个方法处理业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex) {   //ex中封装了异常信息，就是业务层封装的异常对象
        //1.记录日志
        //2.发送消息给运维
        //3.发送邮件给开发人员

        return new Result(ex.getCode(),null,ex.getMessage());
    }

    /**
     * 处理其他异常
     * 配置拦截哪些异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Result ex(Exception e) {
        System.out.println("发生了异常！！！");
        return new Result(666 , null , "未知错误！！！");
    }
}
